# encoding: UTF-8

class Usuarios::Paciente < ActiveRecord::Base

  SEXO = {1 => "Masculino", 2 => "Feminino"}

  attr_accessor :confirmacao_senha
  
  has_many :exames,           :class_name => "Dados::Exame"
  has_many :permissoes,       :class_name => "Usuarios::Permissao"
  has_many :medicos,          :class_name => "Usuarios::Medico", :through => :permissoes

  validates :nome,            :presence => true
  validates :login,           :presence => true
                              #, :uniqueness => true
  validates :senha,           :presence => true,
                              :length => {:minimum => 6}
  validates :email,           :presence => true,
                              #:uniqueness => true,
                              :format => {:with => /.+@.+\..+/ }
  validates :sobrenome,       :presence => true

  validate :validar_confirmacao
  validate :validar_login_unico
  validate :validar_email_unico
  
  after_find  :preencher_confirmacao
  before_save :criptografar_senha
  
  def preencher_confirmacao
    if self.attribute_present?("senha")
      self.confirmacao_senha = self.senha
      @senha_antiga = self.senha
    end
  end
  
  def criptografar_senha
    if self.senha != @senha_antiga
      self.senha = Digest::MD5.hexdigest(self.senha)
    end
  end
  
  # Metodos de Validações
  
  def validar_confirmacao
    if self.senha == self.confirmacao_senha
      return true
    else
      errors.add(:confirmacao_senha, :inconsistent)
    end
  end
  
  def validar_login_unico
    if Usuarios::Administrador.where(:login => self.login, :ativo => true).first or
       Usuarios::Medico.where(:login => self.login, :ativo => true).first
       Usuarios::Paciente.where("login = ? AND ativo = 1 AND id <> ?", self.login, self.id).first
      errors.add(:login, :taken)
    else
      return true
    end
  end
  
  def validar_email_unico
    if Usuarios::Administrador.where(:email => self.email, :ativo => true).first or
       Usuarios::Medico.where(:email => self.email, :ativo => true).first
       Usuarios::Paciente.where("login = ? AND ativo = 1 AND id <> ?", self.login, self.id).first
      errors.add(:email, :taken)
    else
      return true
    end
  end

  # Metodos de classe

  # Interface de busca para cadastros ativos
  def self.buscar_ativos(parametros)
    parametros[:ativo] = true
    Usuarios::Paciente.where(parametros)
  end

  # Metodos de objetos
  
  def validar_login(senha_usuario)
    self.senha == Digest::MD5.hexdigest(senha_usuario)
  end
  
  def criar
    self.ativo = true
    self.save
  end
  
  def atualizar(parametros)
    self.attributes = parametros
    # Não modifica senha se ela não foi alterada
    if not parametros[:senha] or parametros[:senha].empty?
      self.senha = @senha_antiga
      self.confirmacao_senha = @senha_antiga
    end
    self.save
  end
  
  def remover
    self.ativo = false
    self.save
  end

end
